package fr.bugtracker.bean.session;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

import org.springframework.security.core.session.SessionInformation;

import fr.bugtracker.bean.AbstractBean;
import fr.bugtracker.commun.enumeration.EnumLoggerLevel;
import fr.bugtracker.commun.enumeration.EnumParametreApplication;
import fr.bugtracker.commun.outils.UtilsLogger;
import fr.bugtracker.commun.outils.UtilsMetier;
import fr.bugtracker.commun.outils.UtilsSecurity;
import fr.bugtracker.entity.technique.Utilisateur;
import fr.bugtracker.service.SrvApplication;

/**
 * Bean pour l'application
 * @author lparrot
 */
@ManagedBean(eager = true)
@ApplicationScoped
public class BeanApplication extends AbstractBean {

	/**
	 * map des paramètres de l'application
	 */
	private Map<EnumParametreApplication, String> mapParametre = new ConcurrentHashMap<EnumParametreApplication, String>();

	/**
	 * Constructeur de la classe <code>BeanApplication</code>.
	 */
	public BeanApplication() {
	}

	/**
	 * @see fr.bugtracker.bean.AbstractBean#initialisation()
	 */
	@Override
	public void initialisation() {
		mapParametre = UtilsMetier.getService(SrvApplication.class).getListeParametre();
		File dossierApplication = new File(mapParametre.get(EnumParametreApplication.dossier_fichier));
		if (!dossierApplication.exists()) {
			if (!dossierApplication.mkdirs()) {
				UtilsLogger.logFonctionnel(EnumLoggerLevel.error, true, "technique.fichier.erreur_creation", dossierApplication.getAbsolutePath());
			} else {
				UtilsLogger.logFonctionnel(EnumLoggerLevel.info, true, "technique.fichier.creation", dossierApplication.getAbsolutePath());
			}
		}
	}

	/**
	 * Récupère tous les utilisateurs connectés
	 * @return {@link List}< {@link Object} >
	 */
	public List<Object> getAllUtilisateurConnectes() {
		return UtilsSecurity.getAllPrincipals();
	}

	/**
	 * Récupère l'information sur la session par rapport a l'id de la session http
	 * @param idSession {@link String} l'id de la session http
	 * @return {@link SessionInformation}
	 */
	public SessionInformation getInformationSession(String idSession) {
		return UtilsSecurity.getSessionInformation(idSession);
	}

	/**
	 * Récupère toutes les informations sur les sessions d'un utilisateur
	 * @param utilisateur {@link Utilisateur}
	 * @return {@link List}< {@link SessionInformation} >
	 */
	public List<SessionInformation> getAllSessionUtilisateur(Utilisateur utilisateur) {
		return UtilsSecurity.getAllSessions(utilisateur);
	}

	/**
	 * <p><b>Accès en lecture à l'attribut mapParametre.</b></p>
	 * @return Retourne l'attribut mapParametre sous forme de <code>Map<EnumParametreApplication,String></code>.
	 */
	public Map<EnumParametreApplication, String> getMapParametre() {
		return this.mapParametre;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut mapParametre.</b></p>
	 * @param mapParametre L'attribut mapParametre à modifier.
	 */
	public void setMapParametre(Map<EnumParametreApplication, String> mapParametre) {
		this.mapParametre = mapParametre;
	}

}
